//
//  TableShowCollectionBaseVM.swift
//  jhf
//
//  Created by 计海峰 on 2021/12/3.
//  Copyright © 2021 CocoaPods. All rights reserved.
//

import Foundation

import UIKit
import RxSwift
import RxDataSources

// UICollection UITable 控制器 vm
open class TableShowCollectionBaseVM: NSObject, TableViewModelProtocol, RefreshControllable, UITableViewDelegate {

    /// 给默认数据一个key
    public let default_cell_map_key = "dd1c73e29ce98bdd0cf5e8bcd86cefe2"
    
    // MARK: - vm 属性
    public var itemCount = 0
    public var page = 1
    
    public let bag = DisposeBag()
    
    // MARK: - 默认添加一个
    /// 一个table vm 可能有多个 包含  cvc 的 table cell
    /// key: 唯一标记
    /// value: < cvc vm 控制器， 包含 cvc 的 table cell 的  cell model 控制器 >
    /// value 1 是 table cell 的控制器   包含value 0
    public var mapCollectionCellConfig: [String: (CollectionViewBaseVM, TableShowCollectionViewCellModel)] = [:]
    
    
    // MARK: - vm 实现
    open func initDown() {
//        addFirstSectionItems([cvcCreate(default_cell_map_key).1])
        cvcCreate(default_cell_map_key)
    }

    open func configDown() {
        
//        toState(.loading)
//
//        PublicMethod.delay(1) {
//            self.refresh()
//            self.toState(.noData)
//            self.rx.refreshStatus.onNext(.endHeaderRefresh)
//            self.rx.refreshStatus.onNext(.showFooter)
//        }
        
    }
    
    // 生成key 方法
    private func genKeyRandom() -> String {
        return String(describing: self) + "_\(Date().timeString())_\(Int(arc4random()))"
    }
    
    open func refresh() {
        self.page = 1
        forData()
        PublicMethod.delay(1) {
            self.rx.refreshStatus.onNext(.endHeaderRefresh)
        }
    }
    
    open func pullUp() {
        forData()
        PublicMethod.delay(1) {
            self.rx.refreshStatus.onNext(.endFooterRefresh)
        }
    }
    
    open func forData() {
        
    }
    
    // MARK: - 计算 刷新高度
    /// 重写刷新高度 !!!!!
    open func calculateHeight(_ key: String? = nil) {
        let map_key = key ?? default_cell_map_key
        guard let cvcVM = cvcByKey(map_key)?.0 else { return }
        if cvcVM.firstSection().items.count == 0 {
            refreshHeight(key, 0.0)
            return
        }
        let cellHeight = Screen.width/3.0  * CGFloat(((cvcVM.firstSection().items.count - 1) / 3 + 1))
        refreshHeight(key, cellHeight)
    }
    
    open func refreshHeight(_ key: String? = nil, _ height: CGFloat) {
        let map_key = key ?? default_cell_map_key
        guard let cvcVM = cvcByKey(map_key)?.0 else { return }
        cvcVM.cellHeightSubject.onNext(height)
    }
    
    // MARK: - UITableViewDelegate
    open func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return vm_tableView(tableView, heightForRowAt: indexPath)
    }
    
    // MARK: - 创建
    /// 创建cvc对应的
    /// - Parameter key: 默认默认的
    /// - Returns: cvc items 控制的 vm， 包含 cvc 的 cell 控制器
    /// vm 是 config 属性
    @discardableResult
    open func cvcCreate(_ key: String?) -> (CollectionViewBaseVM, TableShowCollectionViewCellModel) {
        
        /// 生成的key
        let map_key = key ?? genKeyRandom()
        
        /// 查看缓存
        if let current_cv = cvcByKey(map_key) { /// 已经生成过了
            return current_cv
        }
        
        /// cvc 控制器 vm
        let cvcVM = CollectionViewBaseVM()
        
        /// cv 控制刷新
        cvcVM.sectionsSubject.skip(1).debounce(.milliseconds(150), scheduler: MainScheduler.instance).asObservable().subscribe(onNext: { _ in
            self.calculateHeight(map_key)
            }).disposed(by: bag)
        cvcVM.isLongPressGesture = true
        
        /// table -> cell config 配置
       let config = TableShowCollectionViewCellModel(cvcVM).then {
            $0.cellHeight = 0.0
        }.addTargetKey(self.bindKey(bag), isTarget: true)
        
        /// 一定是 reloadTable 不然会有问题
        cvcVM.cellHeightSubject.distinctUntilChanged().skip(1).debounce(.milliseconds(200), scheduler: MainScheduler.instance).subscribe(onNext: {
            config.cellHeight = $0
            config.postTableService(.reloadTable)
        }).disposed(by: bag)
        
        /// 缓存上
        mapCollectionCellConfig[map_key] = (cvcVM, config)
        
        return (cvcVM, config)
    }
    
    // 一个tablevm 可能有多个 cvc
    /// 获取cvc对应的
    /// - Parameter key: 默认默认的
    /// - Returns: cvc items 控制的 vm， 包含 cvc 的 cell 控制器
    /// vm 是 config 属性
    open func cvcByKey(_ key: String?) -> (CollectionViewBaseVM, TableShowCollectionViewCellModel)? {
        let map_key = key ?? default_cell_map_key
        if mapCollectionCellConfig.keys.contains(map_key)  {
            return mapCollectionCellConfig[map_key]
        }
        return nil
    }
    
}
